package com.example.demo.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;

    @Value("${spring.controller.path-prefix:}")
    private String pathPrefix;

/*    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //是否发送Cookie
                .allowCredentials(false)
                //放行哪些原始域
                .allowedOrigins("*")
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");
    }*/

    /**
     * 创建并返回一个corsFilter实例。
     * @return corsFilter 返回一个corsFilter实例，用于跨域过滤。
     */
//    @Bean
//    public CorsFilter corsFilter() {
//        //1. 添加 CORS配置信息
//        CorsConfiguration config = new CorsConfiguration();
//        //放行哪些原始域
//        config.addAllowedOrigin("*");
//        //是否发送 Cookie
//        config.setAllowCredentials(false);
//        //放行哪些请求方式
//        config.addAllowedMethod("*");
//        //放行哪些原始请求头部信息
//        config.addAllowedHeader("*");
//        //暴露哪些头部信息
//        config.addExposedHeader("*");
//        //2. 添加映射路径
//        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
//        corsConfigurationSource.registerCorsConfiguration("/**",config);
//        //3. 返回新的CorsFilter
//        return new CorsFilter(corsConfigurationSource);
//    }


    /**
     * 配置路径匹配。
     * 该方法旨在为所有标注了@RestController注解的类添加/api的路径前缀。
     * 这样，所有这些类的处理方法都会将请求路径视为以/api开头。
     *
     * @param configurer PathMatchConfigurer的实例，用于配置路径匹配。
     *                   通过这个参数，我们可以定制Spring MVC如何匹配请求路径。
     */
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        // 添加路径前缀"/api"，并指定只有标注了@RestController注解的类才会应用这个前缀。
        configurer.addPathPrefix(pathPrefix, clazz -> clazz.isAnnotationPresent(RestController.class));
    }
    /**
     * 向拦截器注册表中添加拦截器。
     * 该方法会将指定的拦截器添加到拦截器链中，并定义拦截的路径模式以及需要排除拦截的路径。
     *
     * @param registry 拦截器注册表，用于注册和管理拦截器。
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加登录拦截器
        registry.addInterceptor(loginInterceptor)
                .excludePathPatterns("/api/auth/**","/api/file/**");
    }

}
